///\todo upgrade

//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#ifndef _BUOLA_MAT_DETAIL_FORWARD_H_
#define _BUOLA_MAT_DETAIL_FORWARD_H_

#include <buola/buola.h>

namespace buola { namespace mat {

namespace detail {

    template<typename tSub,size_t vRows,size_t vCols,bool vFullRows,bool vFullCols>
    class CBlock;

    template<typename tSub,typename tSelection>
    class CColSelection;

    template<typename tSub,typename tSelection>
    class CRowSelection;

    template<typename tSub>
    class CColExtension;

    template<typename tSub>
    class CRowExtension;

    template<typename tScalar>
    class CScalarExtension;

    template<typename tSub,typename tPick>
    class CPickSelection;

    template<typename tSub,typename tReduction,typename tResult>
    class CColReduction;

    template<typename tSub,typename tReduction,typename tResult>
    class CRowReduction;

    template<typename tSub>
    class CTranspose;

    template<typename tSub>
    class CInverse;

    template<typename tSub>
    class CDiagonal;

    template<typename tSub>
    class CDiagonalMatrix;

    template<typename tLH,typename tRH>
    class CHJoin;
    
    template<typename tLH,typename tRH>
    class CVJoin;

    template<typename tLH,typename tRH,typename tOp>
    class CElementBinaryOp;

    template<typename tSub,typename tOp>
    class CElementUnaryOp;

    template<typename tSub,typename tOp,typename tNegOp,typename tMode>
    class CCumulativeOp;

    template<typename tSub,typename tOp,bool vRowwise>
    class CDiffOp;

    template<typename tLH,typename tRH>
    class CProduct;
    
    template<typename tSub,typename tMode>
    class CTriangularView;

/*namespace detail*/ }

template<typename tScalar,size_t vRows=cDynamic,size_t vCols=cDynamic>
class CMat;

/*namespace mat*/ } /*namespace buola*/ }

#endif
